package com.itheima.reggie.controller;

import com.itheima.reggie.common.R;
import com.sun.deploy.net.HttpResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

/**
 * @author ：石破天
 * @date ：Created in 2022年05月26日
 * @description ：
 *   处理公共业务的 处理器
 *       上传下载 不属于某个模块 整个项目所有模块上传下载 我都处理
 * @version: 1.0 上传和预览操作
 */
//文件的上传和下载预览  需要两个处理器  公共业务
@RestController
@Slf4j
@RequestMapping("/common")
public class CommonController {
    //去配置文件中 找到 路径变量 赋值
    //获取配置文件中的信息 赋值到属性上
    @Value("${reggie.path}")
    private String basePath;
  //上传的文件 是不是应该存到服务器的一个固定位置
    //下载还得找这个位置  文件上传 上传到服务器存储
    //先把上传的位置 定义在全局变量上(yml中) yml中配置文件上传的位置
    //file是文件的意思   采用Spring中的MultipartFile格式上传文件  替代了socket,等待接收流,输入输出流 最初的后端解析方式
    //upload是上传的意思
    @PostMapping("/upload")
    public  R<String> upload(MultipartFile file){
        //file是上传的文件信息 二进制  因为是图片
        log.info("我们看一下这是什么"+file);
        //获取上传文件的原始名字
        String originalFilename = file.getOriginalFilename();
        log.info("file就是上传的文件信息,file的名字叫啥呢"+originalFilename);
        //suffix后缀名 .jsp
        //substring是string中的方法是截取的意思,  lastIndexOf是String中的方法 是获取最后一次出现的索引
        //根据索引截取获取到后缀名
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        //我们要把图片存到服务器上 图片的名字是随机的 但是图片的类型 必须和原始文件一致
        //UUID.randomUUID().toString() 新的功能 生成随机的字符串32位随机字符串util包下的方法
        //生成的随机字符串要作为什么出现呢?
        //生成随机文件名和指定后缀名  这个文件路径和文件是没有数据的
        String fileName = UUID.randomUUID().toString()+suffix;
        //封装文件地址信息  文件的目录地址进行封装  文件
        File dir = new File(basePath);//把文件的基本目录进行封装 判断它是否存在
        //判断这个文件存不存在  exists方法
        if (!dir.exists()){//不存在
            //创建出来   创建文件的方法 mkdirs
            dir.mkdirs();
        }
        //指定服务器 当前要存储文件的路径   指定文件路径和文件名
        File file1 = new File(dir, fileName);//我们接收上传文件的  新文件构建出来
        //文件的数据来自 file
        try{
            file.transferTo(file1);//把上传的数据 转换到 新的文件中
            //底层是 copy(输入流,输出流)
            //没有异常搞定了
            return R.success(fileName);
        }catch (IOException e){
            e.printStackTrace(); //你的文件如果不存在呢 有权限问题呢 都会在这里爆出
        }
        return R.error("程序上传过程中出现问题了");
    }
    //下载传的是文件名,没有路径
    @GetMapping("/download")
    public void  download(String name, HttpServletResponse response){
        log.info("[进行文件下载,下载的文件名 name]",name);
        //先读后写
        try{
            //要下载的文件在哪
            File file = new File(basePath,name);
            FileInputStream in = new FileInputStream(file);
            ServletOutputStream out = response.getOutputStream();
            //在响应头上告诉 浏览器 要以图片的形式打开
            response.setContentType("image/jpeg");//告诉浏览器的打开方式 设置响应数据类型

            int len = 0;
            byte[] buffer = new byte[8*1024];
            while((len=in.read(buffer))!=-1){
    //写出去
                out.write(buffer,0,len);
            }
            //释放资源
            out.close(); //输出流自动管理
            in.close();
        }catch (IOException e){
            System.out.println("....");
        }
    }
}
